package a1_seqlist;
import java.util.Arrays;
/**
 * 基于数组的顺序表
 */
public class MyArray {

    private int[] data;
    private int size = 0;

    //构造方法
    public MyArray(){
        data = new int[10];
    }
    public MyArray(int l){
        data = new int[l];
    }
    /**  增加 Create  ****************************/
    //尾插元素
    public void addLast(int num){
        addIndex(size,num);
    }
    //头插元素
    public void addFirst(int num){
        addIndex(0,num);
    }
    //中间插入元素
    public void addIndex(int index,int num){//在第index个元素后插入num元素
        if(index<0||index>size){
            System.err.println("add index illegal!");
            return ;
        }
        if(size == data.length)
            grow();
        for(int i=size;i>index;i--){
            data[i] = data[i-1];
        }
        data[index] = num;
        size++;
    }

    /**  查找 Read  ****************************/
    //返回元素的索引号
    public int indexOf(int num){
        for(int i=0;i<size;i++){
            if(data[i] == num){
                return i;
            }
        }
        return -1; //没有该元素
    }
    //判断是否有该元素
    public boolean contains(int num){
        if(indexOf(num) == -1)
            return false;
        else
            return true;
    }
    //返回索引处的元素
    public int get(int index){
        if(index<0||index>=size){
            System.err.println("get index illegal!");
            return -1;
        }
        else
            return data[index];
    }


    /**  修改 Update  ****************************/
    public void set(int index,int num){ //修改索引在index处的元素
        if(index<0||index>=size){
            System.err.println("set index illegal!");
            return ;
        }
        data[index] = num;
    }

    /**  删除 Delete  ****************************/
    //删除索引为index的元素
    public void remove(int index){
        if(index<0||index>=size){
            System.err.println("remove index illegal!");
            return ;
        }
        for(int i=index;i<size-1;i++){
            //防止当size==data.length时，data[i+1]会越界
            data[i] = data[i+1];
        }
        size--;
        data[size] = 0;
        //将最后一个没有被覆盖的元素赋为0
    }
    //删除第一个num元素
    public void removeOnceNum(int num){
        if(indexOf(num) == -1){
            System.err.println("remove num illegal!");
            return ;
        }else{
            for(int i=0;i<size;i++){
                if(data[i] == num){
                    remove(i);
                    return ;
                }
            }
        }
    }
    //删除所有的num元素
    public void removeAllNum(int num){
        if(indexOf(num) == -1){
            System.err.println("remove num illegal!");
            return ;
        }else{
            for(int i=0;i<size;i++){
                while(i!=size && data[i]==num){
                    //确保索引i的位置完全删掉num
                    remove(i);
                }
            }
        }
    }
    //清空顺序表
    public void clear(){
        for(int i=0;i<size;i++){
            data[i] = 0;
        }
        this.size = 0;
    }

    //重写Object类中的toString()方法，打印数组
    @Override
    public String toString(){
        String str = "[";
        for(int i=0;i<size;i++){
            str += data[i];
            if(i<size-1)
                str += ", ";
        }
        str += "]";
        return str;
    }
    //返回元素的个数
    public int size(){
        return this.size;
    }
    //扩容
    private void grow(){
        int[] data2 = Arrays.copyOf(this.data,this.data.length<<1);
        this.data = data2;
    }
}
